昨天以一個使用者的角度解釋了作業系統的服務,今天我要以一個開發者的身份來看看什麼是作業系統,作業系統先將底下對硬體的操作一一封裝,並且提供一組API,應用程式只要透過這組API與作業系統溝通,就能夠使用硬體方面的資源。這組API也被稱為kernel,所以kernel算是作業系統的另一個別名。
Operating System的API大多是用C與C++去撰寫。
比較有名的API有下列三種:
我想在這邊分享一些使用作業系統API的經驗,約莫在幾年前玩某個線上遊戲時,為了使遊戲能夠做一些比較「自動化」的功能,那個時候就寫了一支C++程式,引用了<windows.h>
,windows.h這個函式庫裡面包含所有在Windows作業系統底下的API,那個時候的我就寫了一些抓取到運行的process,並且在上面做一些滑鼠和鍵盤事件。如今對作業系統更有暸解後,突然感到一陣親切呢。
但其實作業系統的API並不會真正的去接觸到硬體的操作,在API底下才有一個層級,叫做System Call,且為了效能,System Call是透過組合語言(Assemble language)撰寫的,一個OS API可能會呼叫零到多個system call,使用者其實可以越過API直接去呼叫system call,但基本上這件事情不會發生,因為system call每一個function都是一個很小的單元(為了方便除錯),一個很小的動作就要呼叫很多個system call來完成,很麻煩又很容易出錯,所以既然都有API幫我們包得好好的,在API能解決的範圍都還是直接call API就好。
前面在Interrupt的章節時有說到,在軟體層會被觸發是因為發生了Error或者system call,在了解system call後不難理解因為每當system call被呼叫時基本上就是走到硬體層,與硬體有一個溝通和等待的時間(比如說等待硬碟的磁頭去讀取哪一部分的資訊),而這時cpu就會去執行其他的instruction,等待硬體回覆後回到原本執行的程式上。